package com.stefanie.nettydemo.test1;

import lombok.extern.slf4j.Slf4j;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;

/**
 * @author:stefanie-zy
 * @time:2023/12/5-9:14
 * @description: 两个Channel之间消息互传。文件传输上限2G。
 */
@Slf4j
public class FileChannelTransferToTest {

    public static void main(String[] args) {
//        test1();
        test2("th_dameng_v1.0.tar", "o.tar");
    }

    // 文件小于2G
    private static void test1() {
        try (FileChannel from = new RandomAccessFile("stefanie.txt", "rw").getChannel(); FileChannel to = new FileOutputStream("to.txt").getChannel();) {
            // 文件拷贝效率高，底层使用操作系统的0拷贝进行优化。
            from.transferTo(0, from.size(), to);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 文件大于2G
    private static void test2(String sourceFileName, String targetFileName) {
        try (FileChannel from = new RandomAccessFile(sourceFileName, "rw").getChannel(); FileChannel to = new FileOutputStream(targetFileName).getChannel();) {
            // 文件长度
            long size = from.size();
            // 文件拷贝效率高，底层使用操作系统的0拷贝进行优化。
            for (long left = size; left > 0; ) {
                log.info("当前位：{}，剩余位：{}", size - left, left);
                left -= from.transferTo(0, from.size(), to);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
